package org.usmile.algorithms.leetcode.middle;

import java.util.Stack;

/**
 * 227. 基本计算器 II
 *
 * 给你一个字符串表达式 s ，请你实现一个基本计算器来计算并返回它的值。
 * 整数除法仅保留整数部分。
 * 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
 * 注意：不允许使用任何将字符串作为数学表达式计算的内置函数，比如 eval() 。
 *
 * 示例 1：
 * 输入：s = "3+2*2"
 * 输出：7
 *
 * 示例 2：
 * 输入：s = " 3/2 "
 * 输出：1
 *
 * 示例 3：
 * 输入：s = " 3+5 / 2 "
 * 输出：5
 *
 * 提示：
 * 1 <= s.length <= 3 * 105
 * s 由整数和算符 ('+', '-', '*', '/') 组成，中间由一些空格隔开
 * s 表示一个 有效表达式
 * 表达式中的所有整数都是非负整数，且在范围 [0, 231 - 1] 内
 * 题目数据保证答案是一个 32-bit 整数
 */
public class _0227 {
}

class _0227_Solution {
    public int calculate(String s) {
        char ops = '+';
        int currNum = 0;
        Stack<Integer> stack = new Stack<>();
        int i = 0;
        while (i < s.length()) {
            if (s.charAt(i) == ' ') {
                i++;
            } else {
                while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    currNum = currNum * 10 + (s.charAt(i) - '0');
                    i++;
                }
                switch (ops) {
                    case '+':
                        stack.push(currNum);
                        break;
                    case '-':
                        stack.push(-currNum);
                        break;
                    case '*':
                        stack.push(stack.pop() * currNum);
                        break;
                    case '/':
                        stack.push(stack.pop() / currNum);
                        break;
                }
                currNum = 0;

                while (i < s.length() && s.charAt(i) == ' ') {
                    i++;
                }

                if (i < s.length()) {
                    ops = s.charAt(i);
                }
            }

            i++;
        }

        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pop();
        }

        return result;
    }
}